/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tresenraya;

import static utilidades.constantes.*;

/**
 *
 * @author Helena
 */
public class DecoradorPosicion implements Cloneable{
    private int tipoMovimiento;
    private int iOrigen;
    private int jOrigen;
    private int iDestino;
    private int jDestino;
    private Posicion posicion;
    private int valor;

    public DecoradorPosicion(Posicion posicion)
    {
        this.posicion = posicion;
    }

    @Override
    public DecoradorPosicion clone()
    {
        DecoradorPosicion posicionDecorada = null;
        try
        {
            posicionDecorada = (DecoradorPosicion) super.clone();
        }catch(CloneNotSupportedException ex){
            System.out.println(" no se puede duplicar el DecoradorPosicion");
            return null;
        }

        posicionDecorada.posicion = this.posicion.clone();

        return posicionDecorada;
    }

    public void ejecutarMovimiento()
    {
        switch(tipoMovimiento)
        {
            case PONER: posicion.ponerFicha(this.iDestino, this.jDestino);
                        break;
            default:    posicion.moverFicha(this.iOrigen, this.jOrigen,
                                            this.iDestino, this.jDestino);
                        break;
        }
    }

    public void setMovimiento(int tipoMovimiento,
                              int ... posicion)
    {
        this.tipoMovimiento = tipoMovimiento;

        switch(tipoMovimiento)
        {
            case PONER: this.iDestino = posicion[0];
                        this.jDestino = posicion[1];
                        break;
            default:    this.iOrigen = posicion[0];
                        this.jOrigen = posicion[1];
                        this.iDestino = posicion[2];
                        this.jDestino = posicion[3];
                        break;
        }
    }

    public void setMovimiento(DecoradorPosicion posicionDecorada)
    {
        switch(posicionDecorada.tipoMovimiento)
        {
            case PONER: setMovimiento(PONER, posicionDecorada.iDestino, posicionDecorada.jDestino);
                        break;
            default:    setMovimiento(MOVER, posicionDecorada.iOrigen, posicionDecorada.jOrigen,
                                             posicionDecorada.iDestino, posicionDecorada.jDestino);
                        break;
        }
    }

    /**
     * @return the tipoMovimiento
     */
    public int getTipoMovimiento() {
        return tipoMovimiento;
    }

    /**
     * @param tipoMovimiento the tipoMovimiento to set
     */
    public void setTipoMovimiento(int tipoMovimiento) {
        this.tipoMovimiento = tipoMovimiento;
    }

    /**
     * @return the iOrigen
     */
    public int getIOrigen() {
        return iOrigen;
    }

    /**
     * @param iOrigen the iOrigen to set
     */
    public void setIOrigen(int iOrigen) {
        this.iOrigen = iOrigen;
    }

    /**
     * @return the jOrigen
     */
    public int getJOrigen() {
        return jOrigen;
    }

    /**
     * @param jOrigen the jOrigen to set
     */
    public void setJOrigen(int jOrigen) {
        this.jOrigen = jOrigen;
    }

    /**
     * @return the iDestino
     */
    public int getIDestino() {
        return iDestino;
    }

    /**
     * @param iDestino the iDestino to set
     */
    public void setIDestino(int iDestino) {
        this.iDestino = iDestino;
    }

    /**
     * @return the jDestino
     */
    public int getJDestino() {
        return jDestino;
    }

    /**
     * @param jDestino the jDestino to set
     */
    public void setJDestino(int jDestino) {
        this.jDestino = jDestino;
    }

    /**
     * @return the posicion
     */
    public Posicion getPosicion() {
        return posicion;
    }

    /**
     * @param posicion the posicion to set
     */
    public void setPosicion(Posicion posicion) {
        this.posicion = posicion;
    }

    /**
     * @return the valor
     */
    public int getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(int valor) {
        this.valor = valor;
    }
}
